//package com.huazai.juc.cec.thread.august.twentyEight;
//
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.Scanner;
//
///**
// * @author Seon
// * @date 2022/8/28 2:02
// */
//public class Main {
//    public static void main(String[] args) throws InterruptedException {
//        Scanner sc = new Scanner(System.in);
//        System.out.println("请输入票数：");
//        int num = sc.nextInt();        //从键盘读入总票数
//        Ticket tickets = new Ticket(num);    //产生票
//
//        new Thread(new SellTicketThread(tickets)).start();//sellTicketThread售票
//        new Thread(new ReturnTicketThread(tickets)).start();//returnTicketThread退票
//
//        Thread.sleep(50);    //休眠等待售票和退票执行完毕
//        System.out.println(tickets.freeNum);
//    }
//}
//
//@Slf4j
//class Ticket {
//    int total;        //总票数
//    int freeNum;    //多线程共享变量：余票数量
//    int soldNum;    //已售出票数
//    boolean hasTicket;    //true表示有足够的票出售，false则表示票数不够
//
//    int count = 3;    //线程售票退票次数
//    int sellNum = 3;    //单次售票数量
//    int returnNum = 2;    //单次退票数量
//
//    public Ticket(int number) {
//        total = number;
//        freeNum = total;    //售票前：总数与余票数相等
//        soldNum = 0;            //已售出票数
//        hasTicket = (freeNum >= sellNum);    //余票足够
//    }
//
//    //在下面补充Ticket类的synchronized售票方法
//    public void sellTicket() throws InterruptedException {
//        synchronized (this) {
//            while (freeNum < sellNum) {
//                this.wait();
//            }
//            freeNum -= sellNum;
//            soldNum += sellNum;
//            System.out.printf("售出%d余票%d\n", sellNum, freeNum);
//            this.notifyAll();
//        }
//    }
//
//    //在下面补充Ticket类的synchronized退票方法，并将Ticket类补充完整
//    public void returnTicket() throws InterruptedException {
//        synchronized (this) {
//            while (returnNum > soldNum || freeNum >= sellNum) {
//                this.wait();
//            }
//            freeNum += returnNum;
//            soldNum -= returnNum;
//            System.out.printf("退回%d余票%d\n", returnNum, freeNum);
//            this.notifyAll();
//        }
//    }
//}
//
//
////在下面补充SellTicketThread类，通过实现Runnable实现SellTicketThread类
//class SellTicketThread implements Runnable {
//    private Ticket ticket;
//
//    public SellTicketThread(Ticket ticket) {
//        this.ticket = ticket;
//    }
//
//    @Override
//    public void run() {
//        for (int i = 0; i < ticket.count; i ++) {
//            try {
//                ticket.sellTicket();
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
//        }
//    }
//}
////在下面补充ReturnTicketThread类，通过实现Runnable实现ReturnTicketThread类
//class ReturnTicketThread implements Runnable {
//
//    private Ticket ticket;
//
//    public ReturnTicketThread(Ticket ticket) {
//        this.ticket = ticket;
//    }
//    @Override
//    public void run() {
//        for (int i = 0; i < ticket.count; i++) {
//            try {
//                ticket.returnTicket();
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
//        }
//    }
//}
